﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using QuanLyTiemVang.DAO;
using QuanLyTiemVang.Classes;
using QuanLyTiemVang.BUS;

namespace QuanLyTiemVang.GUI
{
    /// <summary>
    /// Interaction logic for PhieuDichVu.xaml
    /// </summary>
    public partial class PhieuDichVu : Window, IPhanQuyenHelper
    {
        private class DichVuView
        {
            public int MaDichVu { get; set; }
            public string TenDichVu { get; set; }
            public int SoLuong { get; set; }
            public int DonGiaDichVu { get; set; }
            public decimal ThanhTien { get; set; }
        }
        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);

            // Begin dragging the window
            this.DragMove();
        }
        List<DichVuView> listDV = new List<DichVuView>();

        public PhieuDichVu()
        {
            InitializeComponent();
            if (KhachHangDAO.GetAllKhachHang() != null)
            {
                this.cbMaKhachHang.ItemsSource = KhachHangDAO.GetAllKhachHang().Select(m => m.MaKhachHang);
            }
            else
            {
                this.cbMaKhachHang.ItemsSource = null;
            }

            if (DichVuDAO.GetAllDichVu() != null)
            {
                this.cbMaDichVu.ItemsSource = DichVuDAO.GetAllDichVu().Select(m => m.MaDichVu);
            }
            else
            {
                this.cbMaDichVu.ItemsSource = null;
            }
            this.dpNgayDangKy.SelectedDate = DateTime.Now.Date;
            this.dpNgayGiao.SelectedDate = DateTime.Now.Date;

            List<PHIEUDICHVU> l = PhieuDichVuDAO.GetAllPhieuDichVu();
            if (l.Count == 0)
            {
                this.txtMaPhieu.Text = "0";
            }
            else
            {
                this.txtMaPhieu.Text = (l[l.Count - 1].MaPhieuDichVu + 1).ToString();
            }
            CurrentUser.Instance.AddForm(this);

            this.dpNgayDangKy.SelectedDate = DateTime.Now.Date;
            this.dpNgayDangKy.IsEnabled = false;

            this.ClearAll();
        }

        private void cbMaDichVu_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
        {
            if (this.cbMaDichVu.SelectedIndex == -1)
            {
                this.tbTenDichVu.Text = "";
                this.tbDonGiaDichVu.Text = "";
                this.tbThanhTien.Text = "";
            }
            else
            {
                DICHVU dv = DichVuDAO.SelectDichVuByMaDichVu((int)this.cbMaDichVu.SelectedItem);
                this.tbTenDichVu.Text = dv.TenDichVu;
                this.tbDonGiaDichVu.Text = dv.DonGiaDichVu.ToString();

                decimal x;
                if (decimal.TryParse(this.tbSoLuong.Text, out x) && decimal.TryParse(this.tbDonGiaDichVu.Text, out x))
                {
                    this.tbThanhTien.Text = (decimal.Parse(this.tbSoLuong.Text) * decimal.Parse(this.tbDonGiaDichVu.Text)).ToString();
                }
            }
        }

        private void tbSoLuong_PreviewTextInput_1(object sender, TextCompositionEventArgs e)
        {
            int result;
            if (!(int.TryParse(e.Text, out result)))
            {
                e.Handled = true;
            }
        }

        private void tbSoLuong_LostFocus_1(object sender, RoutedEventArgs e)
        {
            decimal x;
            if (decimal.TryParse(tbDonGiaDichVu.Text, out x) && decimal.TryParse(tbSoLuong.Text, out x))
            {
                tbThanhTien.Text = (decimal.Parse(tbDonGiaDichVu.Text) * decimal.Parse(tbSoLuong.Text)).ToString();
            }
        }

        private void ClearAll()
        {
            this.txtMaPhieu.Text = PhieuDichVuDAO.GetLastMaPhieuDichVu().ToString();
            this.cbMaKhachHang.SelectedIndex = -1;
            this.txtTenKhachHang.Text = "";
            this.dpNgayDangKy.SelectedDate = DateTime.Now.Date;
            this.dpNgayGiao.SelectedDate = DateTime.Now.Date;
            this.txtDiaChi.Text = "";
            this.cbMaDichVu.SelectedIndex = -1;
            this.tbTenDichVu.Text = "";
            this.tbSoLuong.Text = "0";
            this.tbDonGiaDichVu.Text = "0";
            this.tbThanhTien.Text = "0";
            this.dgThongTinPhieuDichVu.ItemsSource = null;
            this.listDV.RemoveRange(0, this.listDV.Count);
            this.txtTongCong.Text = "0";
        }

        private void ClearAddDichVu()
        {
            this.cbMaDichVu.SelectedIndex = -1;
            this.tbDonGiaDichVu.Text = "0";
            this.tbSoLuong.Text = "0";
            this.tbTenDichVu.Text = "";
            this.tbThanhTien.Text = "0";
        }

        private void btnAddDichVu_Click_1(object sender, RoutedEventArgs e)
        {
            int x;
            if (Int32.TryParse(tbSoLuong.Text, out x) == false)
            {
                MessageBox.Show("Chưa nhập vào số lượng.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            if (cbMaDichVu.SelectedIndex != -1 && Int32.Parse(tbSoLuong.Text) > 0)
            {
                foreach (var item in listDV)
                {
                    if ((int)cbMaDichVu.SelectedItem == item.MaDichVu)
                    {
                        MessageBox.Show("Mã dịch vụ đã tồn tại trong danh sách.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                        return;
                    }
                }

                DichVuView dvv = new DichVuView();
                dvv.MaDichVu = (int)cbMaDichVu.SelectedItem;
                dvv.TenDichVu = tbTenDichVu.Text;
                dvv.SoLuong = Int32.Parse(tbSoLuong.Text);
                dvv.DonGiaDichVu = Int32.Parse(tbDonGiaDichVu.Text);
                dvv.ThanhTien = decimal.Parse(tbThanhTien.Text);
                listDV.Add(dvv);
                dgThongTinPhieuDichVu.ItemsSource = null;
                dgThongTinPhieuDichVu.ItemsSource = listDV;
                this.ClearAddDichVu();

                decimal tongTien = 0;
                foreach (var item in listDV)
                {
                    tongTien += item.ThanhTien;
                }
                txtTongCong.Text = tongTien.ToString();
            }
            else
            {
                if (cbMaDichVu.SelectedIndex == -1)
                {
                    MessageBox.Show("Chưa chọn dịch vụ.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else
                {
                    MessageBox.Show("Chưa nhập số lượng.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }

        private void cbMaKhachHang_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
        {
            if (this.cbMaKhachHang.SelectedIndex == -1)
            {
                this.txtTenKhachHang.Text = "";
                this.txtDiaChi.Text = "";
            }
            else
            {
                KHACHHANG kh = KhachHangDAO.SelectKhachHangByMaKhachHang((int)this.cbMaKhachHang.SelectedItem);
                this.txtTenKhachHang.Text = kh.TenKhachHang;
                this.txtDiaChi.Text = kh.DiaChi;
            }
        }

        private void dpNgayDangKy_SelectedDateChanged_1(object sender, SelectionChangedEventArgs e)
        {
            if (dpNgayDangKy.SelectedDate.HasValue)
            {
                if (dpNgayDangKy.SelectedDate.Value.Date < DateTime.Now.Date)
                {
                    MessageBox.Show("Ngày đăng kí không được nhỏ hơn ngày hiện tại.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                    dpNgayDangKy.SelectedDate = DateTime.Now.Date;
                }
            }
        }

        private void dpNgayGiao_SelectedDateChanged_1(object sender, SelectionChangedEventArgs e)
        {
            if (dpNgayGiao.SelectedDate.HasValue)
            {
                if (dpNgayDangKy.SelectedDate.HasValue)
                {
                    if (dpNgayGiao.SelectedDate.Value.Date < dpNgayDangKy.SelectedDate.Value.Date)
                    {
                        MessageBox.Show("Ngày giao không được nhỏ hơn ngày đăng ký dịch vụ.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                        dpNgayGiao.SelectedDate = dpNgayDangKy.SelectedDate;
                        return;
                    }
                }

                if (dpNgayGiao.SelectedDate.Value.Date < DateTime.Now.Date)
                {
                    MessageBox.Show("Ngày giao không được nhỏ hơn ngày hiện tại", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                    dpNgayGiao.SelectedDate = DateTime.Now.Date;
                    return;
                }
            }
        }

        private void dgThongTinPhieuDichVu_LoadingRow_1(object sender, DataGridRowEventArgs e)
        {
            e.Row.Header = (e.Row.GetIndex() + 1).ToString();
        }

        private void dgThongTinPhieuDichVu_RowEditEnding_1(object sender, DataGridRowEditEndingEventArgs e)
        {
            DichVuView dvv = dgThongTinPhieuDichVu.SelectedItem as DichVuView;
            DichVuView d = new DichVuView();
            d.MaDichVu = dvv.MaDichVu;
            d.TenDichVu = dvv.TenDichVu;
            d.SoLuong = dvv.SoLuong;
            d.DonGiaDichVu = dvv.DonGiaDichVu;
            d.ThanhTien = (decimal)d.SoLuong * (decimal)d.DonGiaDichVu;
            listDV.Remove(dvv);
            listDV.Add(d);

            dgThongTinPhieuDichVu.ItemsSource = null;
            dgThongTinPhieuDichVu.ItemsSource = listDV;

            decimal tongTien = 0;
            foreach (var item in listDV)
            {
                tongTien += item.ThanhTien;
            }
            txtTongCong.Text = tongTien.ToString();
        }

        private void dgThongTinPhieuDichVu_PreviewKeyDown_1(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Delete)
            {
                foreach (var row in dgThongTinPhieuDichVu.SelectedItems)
                {
                    DichVuView dvv = row as DichVuView;
                    listDV.Remove(dvv);
                }

                dgThongTinPhieuDichVu.ItemsSource = null;
                dgThongTinPhieuDichVu.ItemsSource = listDV;
            }
        }

        private void btnLapPhieu_Click(object sender, RoutedEventArgs e)
        {
            #region Kiểm tra các giá trị hợp lệ trước khi lập phiếu
            if (this.cbMaKhachHang.SelectedIndex == -1)
            {
                MessageBox.Show("Chưa chọn mã khách hàng.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                cbMaKhachHang.Focus();
                return;
            }

            if (this.dpNgayDangKy.SelectedDate == null)
            {
                MessageBox.Show("Chưa nhập ngày đăng ký.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                dpNgayDangKy.Focus();
                return;
            }

            if (this.dpNgayGiao.SelectedDate == null)
            {
                MessageBox.Show("Chưa nhập vào ngày giao.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
                dpNgayGiao.Focus();
                return;
            }

            if (listDV.Count == 0)
            {
                MessageBox.Show("Chưa nhập thông tin các dịch vụ.", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            #endregion

            MessageBoxResult result = MessageBox.Show("Bạn có chắc chắn muốn lập phiếu dịch vụ với những thông tin trên không?", "Xác nhận lập phiếu", MessageBoxButton.YesNo, MessageBoxImage.Question);
            if (result == MessageBoxResult.No)
                return;

            #region Lập phiếu
            DANHSACHKHOANTHU kt = new DANHSACHKHOANTHU();
            kt.NgayThu = this.dpNgayDangKy.SelectedDate; ;
            kt.TienThuPhieuBanHang = 0;
            kt.TienThuPhieuDichVu = Int32.Parse(this.txtTongCong.Text);
            kt.TongTienThu = kt.TienThuPhieuDichVu;
            DanhSachKhoanThuDAO.Insert(kt);

            // thêm phiếu dịch vụ vào DB
            PHIEUDICHVU pdv = new PHIEUDICHVU();
            // thieu ma danh sach khoan thu
            pdv.MaKhachHang = (int)this.cbMaKhachHang.SelectedItem;
            pdv.NgayDangKy = this.dpNgayDangKy.SelectedDate;
            pdv.NgayGiao = this.dpNgayGiao.SelectedDate;
            pdv.TongCong = Int32.Parse(this.txtTongCong.Text);
            pdv.MaDanhSachKhoanThu = kt.MaDanhSachKhoanThu;
            PhieuDichVuDAO.Insert(pdv);

            // thêm các dịch vụ vào chi tiết
            int idPdv = pdv.MaPhieuDichVu;
            foreach (var item in this.listDV)
            {
                CHITIETPHIEUDICHVU ct = new CHITIETPHIEUDICHVU();
                ct.MaPhieuDichVu = idPdv;
                ct.MaDichVu = item.MaDichVu;
                ct.SoLuong = item.SoLuong;
                ct.ThanhTien = item.ThanhTien;
                ChiTietPhieuDichVuDAO.Insert(ct);
            }
            #endregion

            result = MessageBox.Show("Lập phiếu thành công. Bạn có muốn in phiếu hay không?", "Thông báo", MessageBoxButton.YesNo, MessageBoxImage.Question);
            if (result == MessageBoxResult.No)
            {
                this.ClearAll();
                return;
            }

            System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog();
            sfd.Filter = "PDF File|*.pdf";
            sfd.FileName = "PDV_" + this.txtMaPhieu.Text;
            System.Windows.Forms.DialogResult r = sfd.ShowDialog();
            if (r == System.Windows.Forms.DialogResult.Cancel)
            {
                this.ClearAll();
                return;
            }

            ReportBUS.PhieuDichVuReport(pdv.MaPhieuDichVu, sfd.FileName);
            MessageBox.Show("Đã in phiếu thành công.", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);

            this.ClearAll();
        }

        private void btnXoaPhieu_Click(object sender, RoutedEventArgs e)
        {

        }

        private void btnTaoPhieuMoi_Click(object sender, RoutedEventArgs e)
        {
            this.ClearAll();
        }

        private void btnThoat_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void btnThemKhachHang_Click(object sender, RoutedEventArgs e)
        {
            this.Visibility = Visibility.Hidden;
            DanhSachKhachHang dskh = new DanhSachKhachHang();
            dskh.ShowDialog();
            this.Visibility = Visibility.Visible;
        }

        private void btnTraCuuKhachHang_Click(object sender, RoutedEventArgs e)
        {
            this.Visibility = Visibility.Hidden;
            TraCuuKhachHang tckh = new TraCuuKhachHang();
            tckh.ShowDialog();
            this.Visibility = Visibility.Visible;
        }

        void IPhanQuyenHelper.SetAdminFunction()
        {
        }

        void IPhanQuyenHelper.SetStaffFunction()
        {
        }

        void IPhanQuyenHelper.SetCustomerFunction()
        {
        }

        void IPhanQuyenHelper.SetNonFunction()
        {
            this.Close();
        }

        private void tbSoLuong_TextChanged(object sender, TextChangedEventArgs e)
        {
            int soLuong, donGia;
            if (!(int.TryParse(tbSoLuong.Text, out soLuong)))
            {
                return;
            }
            if (!(int.TryParse(tbDonGiaDichVu.Text, out donGia)))
            {
                return;
            }
            decimal thanhTien = (decimal)donGia * (decimal)soLuong;
            tbThanhTien.Text = thanhTien.ToString();
        }

        private void tbSoLuong_TextChanged_1(object sender, TextChangedEventArgs e)
        {
            decimal x;
            if (decimal.TryParse(tbDonGiaDichVu.Text, out x) && decimal.TryParse(tbSoLuong.Text, out x))
            {
                tbThanhTien.Text = (decimal.Parse(tbDonGiaDichVu.Text) * decimal.Parse(tbSoLuong.Text)).ToString();
            }
        }
    }
}
